μ μΈκ³ κ°λ°μλ₯Ό μν νμ μ€ν¬λ¦½νΈ μΈν°νμ΄μ€μ νμ μ μ°¨μ΄μ , μ¬μ© μ¬λ‘ λ° λͺ¨λ² μ¬λ‘λ₯Ό νꡬνμ¬ μ μ§λ³΄μμ νμ₯μ΄ μ©μ΄ν μ ν리μΌμ΄μ μ λ§λλ μ’ ν© κ°μ΄λμ λλ€.
νμ μ€ν¬λ¦½νΈ μΈν°νμ΄μ€(Interface) vs νμ (Type): κΈλ‘λ² κ°λ°μλ₯Ό μν μ μΈ λͺ¨λ² μ¬λ‘
μλ°μ€ν¬λ¦½νΈμ μμ μ§ν©μΈ νμ μ€ν¬λ¦½νΈλ μ μΈκ³ κ°λ°μλ€μ΄ μ μ νμ΄νμ ν΅ν΄ κ°λ ₯νκ³ νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ μ§μν©λλ€. νμ μ μ μνκΈ° μν λ κ°μ§ κΈ°λ³Έ ꡬ쑰λ μΈν°νμ΄μ€(Interfaces)μ νμ (Types)μ λλ€. μ΄ λμ μ μ¬μ μ 곡μ νμ§λ§, κ·Έ λ―Έλ¬ν μ°¨μ΄μ μ μ ν μ¬μ© μ¬λ‘λ₯Ό μ΄ν΄νλ κ²μ κΉ¨λνκ³ μ μ§λ³΄μνκΈ° μ¬μ°λ©° ν¨μ¨μ μΈ μ½λλ₯Ό μμ±νλ λ° μ€μν©λλ€. μ΄ μ’ ν© κ°μ΄λμμλ νμ μ€ν¬λ¦½νΈ μΈν°νμ΄μ€μ νμ μ μ°¨μ΄μ μ κΉμ΄ νκ³ λ€μ΄ νλ‘μ νΈμμ μ΄λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νκΈ° μν λͺ¨λ² μ¬λ‘λ₯Ό νꡬν κ²μ λλ€.
νμ μ€ν¬λ¦½νΈ μΈν°νμ΄μ€ μ΄ν΄νκΈ°
νμ μ€ν¬λ¦½νΈμ μΈν°νμ΄μ€(Interface)λ κ°μ²΄μ κ³μ½(contract)μ μ μνλ κ°λ ₯ν λ°©λ²μ λλ€. μ΄λ κ°μ²΄κ° κ°μ ΈμΌ ν μμ±, ν΄λΉ μμ±μ λ°μ΄ν° νμ , κ·Έλ¦¬κ³ μ νμ μΌλ‘ ꡬνν΄μΌ ν λ©μλλ₯Ό λͺ μνμ¬ κ°μ²΄μ ννλ₯Ό κ°κ΄μ μΌλ‘ μ€λͺ ν©λλ€. μΈν°νμ΄μ€λ μ£Όλ‘ κ°μ²΄μ ꡬ쑰λ₯Ό μ€λͺ νλ λ° μ¬μ©λ©λλ€.
μΈν°νμ΄μ€ ꡬ문 λ° μμ
μΈν°νμ΄μ€λ₯Ό μ μνλ ꡬ문μ κ°λ¨ν©λλ€:
interface User {
id: number;
name: string;
email: string;
isActive: boolean;
}
const user: User = {
id: 123,
name: "Alice Smith",
email: "alice.smith@example.com",
isActive: true,
};
μ΄ μμ μμ User
μΈν°νμ΄μ€λ μ¬μ©μ κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€. user
λ³μμ ν λΉλ λͺ¨λ κ°μ²΄λ μ΄ κ΅¬μ‘°λ₯Ό μ€μν΄μΌ νλ©°, κ·Έλ μ§ μμΌλ©΄ νμ
μ€ν¬λ¦½νΈ μ»΄νμΌλ¬κ° μ€λ₯λ₯Ό λ°μμν΅λλ€.
μΈν°νμ΄μ€μ μ£Όμ νΉμ§
- κ°μ²΄ νν μ μ: μΈν°νμ΄μ€λ κ°μ²΄μ ꡬ쑰 λλ "νν"λ₯Ό μ μνλ λ° νμν©λλ€.
- νμ₯μ±: μΈν°νμ΄μ€λ
extends
ν€μλλ₯Ό μ¬μ©νμ¬ μ½κ² νμ₯ν μ μμ΄ μμκ³Ό μ½λ μ¬μ¬μ©μ κ°λ₯νκ² ν©λλ€. - μ μΈ λ³ν©(Declaration Merging): νμ μ€ν¬λ¦½νΈλ μΈν°νμ΄μ€μ λν μ μΈ λ³ν©μ μ§μν©λλ€. μ¦, λμΌν μΈν°νμ΄μ€λ₯Ό μ¬λ¬ λ² μ μΈνλ©΄ μ»΄νμΌλ¬κ° μ΄λ₯Ό λ¨μΌ μ μΈμΌλ‘ λ³ν©ν©λλ€.
μ μΈ λ³ν© μμ
interface Window {
title: string;
}
interface Window {
height: number;
width: number;
}
const myWindow: Window = {
title: "My Application",
height: 800,
width: 600,
};
μ¬κΈ°μ Window
μΈν°νμ΄μ€λ λ λ² μ μΈλμμ΅λλ€. νμ
μ€ν¬λ¦½νΈλ μ΄λ¬ν μ μΈλ€μ λ³ν©νμ¬ ν¨κ³Όμ μΌλ‘ title
, height
, width
μμ±μ κ°μ§ μΈν°νμ΄μ€λ₯Ό μμ±ν©λλ€.
νμ μ€ν¬λ¦½νΈ νμ νꡬνκΈ°
νμ μ€ν¬λ¦½νΈμ νμ (Type)μ λ°μ΄ν°μ ννλ₯Ό μ μνλ λ°©λ²μ μ 곡ν©λλ€. μΈν°νμ΄μ€μ λ¬λ¦¬ νμ μ λ λ€μ¬λ€λ₯νλ©° μμ νμ , μ λμΈ, μΈν°μΉμ , ννμ ν¬ν¨ν λ λμ λ²μμ λ°μ΄ν° ꡬ쑰λ₯Ό λνλΌ μ μμ΅λλ€.
νμ ꡬ문 λ° μμ
νμ λ³μΉ(type alias)μ μ μνλ ꡬ문μ λ€μκ³Ό κ°μ΅λλ€:
type Point = {
x: number;
y: number;
};
const origin: Point = {
x: 0,
y: 0,
};
μ΄ μμ μμ Point
νμ
μ x
μ y
μ’νλ₯Ό κ°μ§ ν¬μΈνΈ κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€.
νμ μ μ£Όμ νΉμ§
- μ λμΈ νμ (Union Types): νμ μ μ¬λ¬ νμ μ ν©μ§ν©μ λνλΌ μ μμ΄ λ³μκ° λ€λ₯Έ νμ μ κ°μ κ°μ§ μ μκ² ν©λλ€.
- μΈν°μΉμ νμ (Intersection Types): νμ μ μ¬λ¬ νμ μ κ΅μ§ν©μ λνλΌ μλ μμ΄ λͺ¨λ νμ μ μμ±μ λ¨μΌ νμ μΌλ‘ κ²°ν©ν©λλ€.
- μμ νμ
(Primitive Types): νμ
μ
string
,number
,boolean
λ±κ³Ό κ°μ μμ νμ μ μ§μ λνλΌ μ μμ΅λλ€. - νν νμ (Tuple Types): νμ μ κ° μμμ λν΄ νΉμ νμ μ κ°μ§λ κ³ μ κΈΈμ΄ λ°°μ΄μΈ ννμ μ μν μ μμ΅λλ€.
- λ λμ λ²μ©μ±: μμ λ°μ΄ν° νμ λΆν° 볡μ‘ν κ°μ²΄ ννκΉμ§ κ±°μ λͺ¨λ κ²μ μ€λͺ ν μ μμ΅λλ€.
μ λμΈ νμ μμ
type Result = {
success: true;
data: any;
} | {
success: false;
error: string;
};
const successResult: Result = {
success: true,
data: { message: "Operation successful!" },
};
const errorResult: Result = {
success: false,
error: "An error occurred.",
};
Result
νμ
μ λ°μ΄ν°κ° μλ μ±κ³΅ λλ μ€λ₯ λ©μμ§κ° μλ μ€ν¨ μ€ νλμΌ μ μλ μ λμΈ νμ
μ
λλ€. μ΄λ μ±κ³΅νκ±°λ μ€ν¨ν μ μλ μμ
μ κ²°κ³Όλ₯Ό λνλ΄λ λ° μ μ©ν©λλ€.
μΈν°μΉμ νμ μμ
type Person = {
name: string;
age: number;
};
type Employee = {
employeeId: string;
department: string;
};
type EmployeePerson = Person & Employee;
const employee: EmployeePerson = {
name: "Bob Johnson",
age: 35,
employeeId: "EMP123",
department: "Engineering",
};
EmployeePerson
νμ
μ Person
κ³Ό Employee
μ μμ±μ λͺ¨λ κ²°ν©ν μΈν°μΉμ
νμ
μ
λλ€. μ΄λ₯Ό ν΅ν΄ κΈ°μ‘΄ νμ
μ κ²°ν©νμ¬ μλ‘μ΄ νμ
μ μμ±ν μ μμ΅λλ€.
μ£Όμ μ°¨μ΄μ : μΈν°νμ΄μ€ vs νμ
μΈν°νμ΄μ€μ νμ λͺ¨λ νμ μ€ν¬λ¦½νΈμμ λ°μ΄ν° ꡬ쑰λ₯Ό μ μνλ λͺ©μ μ μννμ§λ§, μ΄λ κ²μ μΈμ μ¬μ©ν΄μΌ ν μ§μ μν₯μ λ―ΈμΉλ μ£Όμ μ°¨μ΄μ μ΄ μμ΅λλ€:
- μ μΈ λ³ν©: μΈν°νμ΄μ€λ μ μΈ λ³ν©μ μ§μνμ§λ§, νμ μ κ·Έλ μ§ μμ΅λλ€. μ¬λ¬ νμΌμ΄λ λͺ¨λμ κ±Έμ³ νμ μ μλ₯Ό νμ₯ν΄μΌ νλ κ²½μ° μΌλ°μ μΌλ‘ μΈν°νμ΄μ€κ° μ νΈλ©λλ€.
- μ λμΈ νμ : νμ μ μ λμΈ νμ μ λνλΌ μ μμ§λ§, μΈν°νμ΄μ€λ μ§μ μ μΌλ‘ μ λμΈμ μ μν μ μμ΅λλ€. μ¬λ¬ λ€λ₯Έ νμ μ€ νλκ° λ μ μλ νμ μ μ μν΄μΌ νλ€λ©΄ νμ λ³μΉμ μ¬μ©νμΈμ.
- μΈν°μΉμ
νμ
: νμ
μ
&
μ°μ°μλ₯Ό μ¬μ©νμ¬ μΈν°μΉμ νμ μ μμ±ν μ μμ΅λλ€. μΈν°νμ΄μ€λ λ€λ₯Έ μΈν°νμ΄μ€λ₯Ό νμ₯νμ¬ μ μ¬ν ν¨κ³Όλ₯Ό μ»μ μ μμ§λ§, μΈν°μΉμ νμ μ΄ λ λ§μ μ μ°μ±μ μ 곡ν©λλ€. - μμ νμ : νμ μ μμ νμ (string, number, boolean)μ μ§μ λνλΌ μ μμ§λ§, μΈν°νμ΄μ€λ μ£Όλ‘ κ°μ²΄ ννλ₯Ό μ μνκΈ° μν΄ μ€κ³λμμ΅λλ€.
- μ€λ₯ λ©μμ§: μΌλΆ κ°λ°μλ€μ νΉν 볡μ‘ν νμ ꡬ쑰λ₯Ό λ€λ£° λ νμ λ³΄λ€ μΈν°νμ΄μ€κ° μ½κ° λ λͺ νν μ€λ₯ λ©μμ§λ₯Ό μ 곡νλ€κ³ μκ°ν©λλ€.
λͺ¨λ² μ¬λ‘: μΈν°νμ΄μ€μ νμ μ€ μ ννκΈ°
μΈν°νμ΄μ€μ νμ μ¬μ΄μ μ νμ νλ‘μ νΈμ νΉμ μꡬμ¬νκ³Ό κ°μΈμ μΈ μ νΈλμ λ°λΌ λ¬λΌμ§λλ€. κ³ λ €ν΄μΌ ν λͺ κ°μ§ μΌλ°μ μΈ μ§μΉ¨μ λ€μκ³Ό κ°μ΅λλ€:
- κ°μ²΄μ ννλ₯Ό μ μν λλ μΈν°νμ΄μ€λ₯Ό μ¬μ©νμΈμ: μ£Όλ‘ κ°μ²΄μ ꡬ쑰λ₯Ό μ μν΄μΌ νλ κ²½μ°, μΈν°νμ΄μ€κ° μμ°μ€λ½κ² μ ν©ν©λλ€. μΈν°νμ΄μ€μ νμ₯μ±κ³Ό μ μΈ λ³ν© κΈ°λ₯μ λκ·λͺ¨ νλ‘μ νΈμμ μ μ©ν μ μμ΅λλ€.
- μ λμΈ νμ , μΈν°μΉμ νμ , μμ νμ μλ νμ μ μ¬μ©νμΈμ: νμ μ ν©μ§ν©, κ΅μ§ν© λλ κ°λ¨ν μμ νμ μ λνλ΄μΌ ν λλ νμ λ³μΉμ μ¬μ©νμΈμ.
- μ½λλ² μ΄μ€ λ΄μμ μΌκ΄μ±μ μ μ§νμΈμ: μΈν°νμ΄μ€λ νμ μ€ μ΄λ κ²μ μ ννλ , νλ‘μ νΈ μ λ°μ κ±Έμ³ μΌκ΄μ±μ μ μ§νκΈ° μν΄ λ Έλ ₯νμΈμ. μΌκ΄λ μ€νμΌμ μ¬μ©νλ©΄ μ½λ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ΄ ν₯μλ©λλ€.
- μ μΈ λ³ν©μ κ³ λ €νμΈμ: μ¬λ¬ νμΌμ΄λ λͺ¨λμ κ±Έμ³ νμ μ μλ₯Ό νμ₯ν΄μΌ ν κ²μΌλ‘ μμλλ κ²½μ°, μ μΈ λ³ν© κΈ°λ₯ λλ¬Έμ μΈν°νμ΄μ€κ° λ λμ μ νμ λλ€.
- κ³΅κ° APIμλ μΈν°νμ΄μ€λ₯Ό μ νΈνμΈμ: κ³΅κ° APIλ₯Ό μ€κ³ν λ, μΈν°νμ΄μ€λ λ νμ₯ κ°λ₯νκ³ API μ¬μ©μκ° μ μν νμ μ μ½κ² νμ₯ν μ μκ² ν΄μ£Όλ―λ‘ μ’ μ’ μ νΈλ©λλ€.
μ€μ©μ μΈ μμ : κΈλ‘λ² μ ν리μΌμ΄μ μλ리μ€
μΈν°νμ΄μ€μ νμ μ΄ κΈλ‘λ² μ ν리μΌμ΄μ μμ μ΄λ»κ² μ¬μ©λ μ μλμ§ λ³΄μ¬μ£Όλ λͺ κ°μ§ μ€μ©μ μΈ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
1. μ¬μ©μ νλ‘ν κ΄λ¦¬ (κ΅μ ν)
μ¬λ¬ μΈμ΄λ₯Ό μ§μνλ μ¬μ©μ νλ‘ν κ΄λ¦¬ μμ€ν μ ꡬμΆνλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ μ¬μ©μ νλ‘νμ ꡬ쑰λ₯Ό μ μνκ³ , νμ μ μ¬μ©νμ¬ λ€λ₯Έ μΈμ΄ μ½λλ₯Ό λνλΌ μ μμ΅λλ€:
interface UserProfile {
id: number;
name: string;
email: string;
preferredLanguage: LanguageCode;
address: Address;
}
interface Address {
street: string;
city: string;
country: string;
postalCode: string;
}
type LanguageCode = "en" | "fr" | "es" | "de" | "zh"; // Example language codes
const userProfile: UserProfile = {
id: 1,
name: "John Doe",
email: "john.doe@example.com",
preferredLanguage: "en",
address: { street: "123 Main St", city: "Anytown", country: "USA", postalCode: "12345" }
};
μ¬κΈ°μ UserProfile
μΈν°νμ΄μ€λ μ νΈ μΈμ΄λ₯Ό ν¬ν¨ν μ¬μ©μ νλ‘νμ ꡬ쑰λ₯Ό μ μν©λλ€. LanguageCode
νμ
μ μ§μλλ μΈμ΄λ₯Ό λνλ΄λ μ λμΈ νμ
μ
λλ€. Address
μΈν°νμ΄μ€λ μΌλ°μ μΈ κΈλ‘λ² νμμ κ°μ νμ¬ μ£Όμ νμμ μ μν©λλ€.
2. ν΅ν λ³ν (μΈκ³ν)
λ€λ₯Έ ν΅νμ νμ¨μ μ²λ¦¬ν΄μΌ νλ ν΅ν λ³ν μ ν리μΌμ΄μ μ μκ°ν΄ λ΄ μλ€. μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ ν΅ν κ°μ²΄μ ꡬ쑰λ₯Ό μ μνκ³ , νμ μ μ¬μ©νμ¬ ν΅ν μ½λλ₯Ό λνλΌ μ μμ΅λλ€:
interface Currency {
code: CurrencyCode;
name: string;
symbol: string;
}
interface ExchangeRate {
baseCurrency: CurrencyCode;
targetCurrency: CurrencyCode;
rate: number;
}
type CurrencyCode = "USD" | "EUR" | "GBP" | "JPY" | "CAD"; // Example currency codes
const usd: Currency = {
code: "USD",
name: "United States Dollar",
symbol: "$",
};
const exchangeRate: ExchangeRate = {
baseCurrency: "USD",
targetCurrency: "EUR",
rate: 0.85,
};
Currency
μΈν°νμ΄μ€λ μ½λ, μ΄λ¦, κΈ°νΈλ₯Ό ν¬ν¨ν ν΅ν κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€. CurrencyCode
νμ
μ μ§μλλ ν΅ν μ½λλ₯Ό λνλ΄λ μ λμΈ νμ
μ
λλ€. ExchangeRate
μΈν°νμ΄μ€λ λ€λ₯Έ ν΅ν κ°μ λ³νμ¨μ λνλ΄λ λ° μ¬μ©λ©λλ€.
3. λ°μ΄ν° μ ν¨μ± κ²μ¬ (κ΅μ νμ)
λ€λ₯Έ κ΅κ°μ μ¬μ©μλ‘λΆν° λ°μ΄ν° μ λ ₯μ μ²λ¦¬ν λ, μ¬λ°λ₯Έ κ΅μ νμμ λ°λΌ λ°μ΄ν°λ₯Ό κ²μ¦νλ κ²μ΄ μ€μν©λλ€. μλ₯Ό λ€μ΄, μ νλ²νΈλ κ΅κ° μ½λμ λ°λΌ λ€λ₯Έ νμμ κ°μ§λλ€. νμ μ μ΄λ¬ν λ³νμ λνλ΄λ λ° μ¬μ©λ μ μμ΅λλ€.
type PhoneNumber = {
countryCode: string;
number: string;
isValid: boolean; // Add a boolean to represent valid/invalid data.
};
interface Contact {
name: string;
phoneNumber: PhoneNumber;
email: string;
}
function validatePhoneNumber(phoneNumber: string, countryCode: string): PhoneNumber {
// Validation logic based on countryCode (e.g., using a library like libphonenumber-js)
// ... Implementation here to validate number.
const isValid = true; //placeholder
return { countryCode, number: phoneNumber, isValid };
}
const contact: Contact = {
name: "Jane Doe",
phoneNumber: validatePhoneNumber("555-123-4567", "US"), //example
email: "jane.doe@email.com",
};
console.log(contact.phoneNumber.isValid); //output validation check.
κ²°λ‘ : νμ μ€ν¬λ¦½νΈ μ μΈ λ§μ€ν°νκΈ°
νμ μ€ν¬λ¦½νΈ μΈν°νμ΄μ€μ νμ μ λ°μ΄ν° ꡬ쑰λ₯Ό μ μνκ³ μ½λ νμ§μ ν₯μμν€λ κ°λ ₯ν λꡬμ λλ€. μ΄λ€μ μ°¨μ΄μ μ μ΄ν΄νκ³ ν¨κ³Όμ μΌλ‘ νμ©νλ κ²μ κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯νλ©° νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμμ μ λλ€. μ΄ κ°μ΄λμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄, μΈν°νμ΄μ€μ νμ μ μΈμ μ¬μ©ν΄μΌ ν μ§μ λν΄ μ 보μ μ κ°ν κ²°μ μ λ΄λ¦΄ μ μμΌλ©°, κΆκ·Ήμ μΌλ‘ νμ μ€ν¬λ¦½νΈ κ°λ° μν¬νλ‘μ°λ₯Ό κ°μ νκ³ νλ‘μ νΈμ μ±κ³΅μ κΈ°μ¬ν μ μμ΅λλ€.
μΈν°νμ΄μ€μ νμ μ¬μ΄μ μ νμ μ’ μ’ κ°μΈμ μΈ μ νΈλμ νλ‘μ νΈ μꡬμ¬νμ λ¬Έμ λΌλ κ²μ κΈ°μ΅νμΈμ. λ κ°μ§ μ κ·Ό λ°©μμ λͺ¨λ μ€ννμ¬ μμ κ³Ό νμ κ°μ₯ μ ν©ν λ°©λ²μ μ°Ύμ보μΈμ. νμ μ€ν¬λ¦½νΈμ νμ μμ€ν μ νμ λ°μλ€μ΄λ κ²μ μμ¬ν μ¬μ§ μμ΄ λ μ λ’°ν μ μκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ‘ μ΄μ΄μ Έ μ μΈκ³ κ°λ°μλ€μκ² ννμ μ€ κ²μ λλ€.